\documentclass{article}

\usepackage{amsmath}
\usepackage[pdftex]{graphicx}
\usepackage[usenames]{color}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{xspace}
\usepackage[pdfborder={0 0 0 0},linkcolor=blue,colorlinks=true]{hyperref}
\usepackage{setspace}
\onehalfspacing

\newcommand{\gerecoto}{\texttt{GeRecoTo}\xspace}

\title{\gerecoto Projekt Dokumentation} 
\author{Müller Clemens (957182) \\ Öhlschuster Manfred (957126)}
\date{Jänner, 2010}


\begin{document}

\maketitle
\tableofcontents

\vspace{1cm}
\hrule
\vspace{1cm}

\section{Einführung}

Dieser Abschnitt gibt eine Einführung in die entwickelte Software namens
\gerecoto. \gerecoto steht für \textbf{Ge}sture \textbf{Reco}gnition
\textbf{To}ol und ist eine Software welche Gesten erkennt, visualisiert und
propagiert. Die Applikation wurde im Rahmen der Übung für ``Pervasive Computing
Infrastructure'' und ``Pervasive Computing Systems Development'' unter der
Leitung von Dr. Simon Vogl im Wintersemester 09/10 an der JKU entwickelt.

Dieses Dokument dient als rudimentäre Dokumentation und soll einen Einblick in
die entwickelte Software sowie die dahinterstehenden Konzepte und verwendeten
Technologien geben.

\subsection{Die Idee}
\label{subsec:ideeDahinter}

Die Idee hinter \gerecoto ist simpel: Eine Person hat die Möglichkeit mit den
beiden Händen Gesten durchzuführen, welche vom System erkannt werden. Hierzu
wird an dem linken und rechten Handgelenk, so wie vorne und hinten am Gürtel
jeweils ein Sensor befestigt. Die beiden Sensoren am Gürtel dienen dabei als
Referenzpunkte. Mittels den Sensoren an den Händen wird erkannt, ob die Person
die Hände ausstreckt oder beispielsweise in die Höhe hält.

\subsection{Mögliche Gesten}

\gerecoto erkennt 11 verschiedene Gesten, welche in der folgenden Auflistung
näher beschrieben werden.

\begin{itemize}
  \item \textbf{LDRD} -- (left down, right down) -- beide Arme sind ausgestreckt nach
  unten gerichtet
  \item \textbf{LDRS} -- (left down, right strechted out) -- linker Arm ist nach unten
  gerichtet, der rechte Arm ist waagrecht ausgrestreckt
  \item \textbf{LDRU} -- (left down, right up) -- linker Arm nach unten
  gestreckt, rechter Arm senkrecht in die Höhe
  \item \textbf{LSRD} -- left stretched out, right down -- linker Arm waagerecht
  ausgestreckt, rechter Arm nach unten
  \item \textbf{LSRS0} -- (left and right stretched out) -- beide Arme sind
  waagerecht nach vorne ausgestreckt und bilden idealerweise einen Winkel zwischen den
  Armen von $0^\circ$
  \item \textbf{LSRS90} -- (left and right stretched out) -- beide Arme sind
  waagerecht ausgestreckt und bilden einen rechten Winkel (üblicherweise ist ein Arm nach
  vorne und der andere auf die Seite ausgestreckt)
  \item \textbf{LSRS180} -- (left and right stretched out) -- die Arme sind
  seitlich ausgestreckt und bilden einen Winkel von circa $180^\circ$
  \item \textbf{LSRU} -- (left stretched, right up) -- linker Arm ist waagerecht
  ausgestreckt, der rechte Arm ist senkrecht in die Höhe
  \item \textbf{LURD} -- (left up, right down) -- linker Arm senkrecht in die
  Höhe, der rechte Arm ist nach unten gestreckt
  \item \textbf{LURS} -- (left up, right stretched out) -- der linke Arm ist
  ausgestreckt nach oben, der rechte Arm ist waagerecht ausgestreckt
  \item \textbf{LURU} -- (left and right arm up) -- beide Arme sind ausgestreckt nach
  oben
\end{itemize}

Aufgrund technischer Begrenzungen spielt es bei einigen Gesten, welche einen
gestreckten Arm beinhalten, keine Rolle ob der Arm auf die Seite, nach vorne
oder in einem anderen Winkel ausgestreck ist. Wichtig ist nur dass er
waagerecht ausgestreckt wird.

\subsection{Kalibrierung des Systems}
\label{sec:calibration}

Damit die Gesten richtig erkannt werden, muss das System noch kalibriert
werden. Hierzu ist die Angabe von 4 Parametern entscheidend.

\subsubsection*{angleTolerance}

Um eine Aussage darüber treffen zu können, ob die beiden Arme seitlich
ausgestreckt sind oder etwa beide Arme nach vorne gerichtet sind, wird der
Winkel zwischen den beiden Armen und dem Referenzpunkt gemessen (siehe
Abbildung~\ref{fig:alpha}).

\begin{figure}[htp]
\begin{center}
  \includegraphics[width=150px]{image/alpha.pdf}
  \caption{Winkel $\alpha$ zwischen beiden Armen}
  \label{fig:alpha}
\end{center}
\end{figure}


Der Parameter $angleTolerance$ gibt dem System bekannt, wieviel Abweichung noch
toleriert wird, sodass ein Winkel $\alpha$ noch als vorgegebener Winkel $\beta$
erkannt wird. Die Angabe des Winkels erfolgt in Radianten:

$$\left| \beta - \alpha \right | \leq angleTolerance$$

\subsubsection*{equalHeihtTolerance}

Die Aussage ob zwei Positionen dieselbe Höhe besitzen wird bei der Erkennung
von einigen Gesten verwendet. Um Ungenauigkeiten bei der Messung der Positionen
zu kompensieren, kann mittels des $equalHeihtTolerance$ Parameters die Toleranz
abgegebebn werden, innerhalb derer zwei Positionen mit der selben Höhe erkannt
werden. Die Angabe dieses Parameters erfolgt in Meter.

Zwei Positionen $p_1$ und $p_2$ haben demnach dieselbe Höhe, wenn folgende
Berechnung wahr ist:

$$\left| p_{1}.z - p_{2}.z \right| \leq equalHeihtTolerance$$

\subsubsection*{lowerHeightTolerance}

Einige Gesten verwenden die Charakteristik ob sich eine Position $p_1$ unterhalb
einer anderen Position $p_2$ befindet. Um Ungenauigkeiten in der Messung zu
kompensieren, wird hierzu der Parameter $lowerHeightTolerance$ verwendet.
Dieser Parameter gibt an, um wieviel eine Position mindestens unterhalb einer
anderen sein muss, damit die Eigenschaft ``ist unterhalb'' wahr ist:

$$p_{2}.z - p_{1}.z \geq lowerHeightTolerance$$

\subsubsection*{zOffset}

Aus den beiden Sensoren welche sich am Gürtel vorne und hinten befinden, wird
eine Referenzposition berechnet. Damit die Erkennung der Gesten leichter
realisiert werden kann, wird dieser Referenzpunkt auf der Z-Achse nach oben
verschoben. Der Parameter \emph{zOffset} gibt an, um wieviel der Referenzpunkt
nach oben verschoben werden soll, sodass bei waagerecht ausgestreckten Armen
eine Gerade gebildet werden kann.

\section{Realisierung}

Das folgende Kapitel behandelt die Details zur Realisierung von \gerecoto.

\subsection{Vorverarbeitung}

Die eingehenden Positionen zu den vier Tags werden mittels einem
Mittelwert-Filter vorverarbeitet. Weitere Vorverarbeitungen wie Ausreisser und
sonstige Filter sind nicht notwending, da der Mittelwertfilter bei einer
Updaterate der Tag-Positionen zu jedem 16-ten Time Slot, bereits brauchbare
Ergebnisse liefert.

Die Berechnung der Referenzposition kann als weiterer Vorverarbeitungsschritt
bezeichnet werden. Die Referenzposition $refPos$ wird wie folgt aus den beiden
Sensor-Positionen $frontPos$ und $backPos$ am Gürtel berechnet:

\begin{align*}
refPos_x &= \frac{1}{2} \cdot (frontPos_x + backPos_x) \\
refPos_y &= \frac{1}{2} \cdot (frontPos_y + backPos_y) \\
refPos_z &= \frac{1}{2} \cdot (frontPos_z + backPos_z) + zOffset
\end{align*}


\subsection{Erkennung von Gesten}

Um eine Geste zu erkennen werden zuerst die Charakteristika der 3 Positionen
(links, rechts und Referenz) berechnet. Anschließend wird anhand der
Charakteristik entschieden, welche Geste von den 3 Positionen bestimmt wird.
Kann keine Geste extrahiert/erkannt werden, so wird die Pseudo-Geste
\emph{NONE} angenommen. Die jeweiligen Entscheidungskriterien für eine Geste
können der Tabelle \ref{tab:gestureCharacteristics} entnommen werden.

Beispielsweise wird daher die Geste \emph{LDRD} -- sprich linker Arm und
rechter Arm unten -- erkannt, wenn sich der linke und der rechte Sensor
unterhalb der errechneten Referenzposition befindet.

\begin{table}
\begin{tabular}{l|lll}
\textbf{Geste} & \multicolumn{3}{c}{\textbf{Prädikate}} \\
\hline \hline
LDRD & $left < ref$ & $right < ref$ & \\
LDRS & $left < ref$ & $ref \approx right$ & \\
LDRU & $left < ref$ & $ref < right$ & $left < right$ \\
LSRD & $left \approx ref$ & $right < ref$ & \\
LSRS0 & $left \approx ref$ & $right \approx ref$ & $angleXY \approx 0^\circ$\\
LSRS90 & $left \approx ref$ & $right \approx ref$ & $angleXY \approx90^\circ$\\
LSRS180 & $left \approx ref$ & $right \approx ref$ & $angleXY \approx180^\circ$ \\
LSRU & $left \approx ref$ & $ref < right$ & $left < right$ \\
LURD & $ref < left$ & $right < ref$ & $right < left$ \\
LURS & $ref < left$ & $right \approx ref$ & $right < left$ \\
LURU & $ref < left$ & $ref < right$ & $left \approx right$ \\
NONE & \multicolumn{3}{l}{sonstige}
\end{tabular}
\caption{Charakteristika der einzelnen Gesten}
\label{tab:gestureCharacteristics}
\end{table}

Damit eine Geste erkannt wird, muss diese über einen gewissen Zeitraum
(beispielsweise die letzten 2 Sekunden) mit einem gewissen Anteil
(beispielsweise von über 75\%) aufgetreten sein. Diese Parameter können
innerhalb \gerecoto eingestellt werden. Je kleiner der Zeitraum eingestellt
wird, desto schneller wird eine Folge von Gesten als erkannt gesetzt. Je höher
der Anteil eingestellt wird, desto weniger Ausreisser dürfen in den Gesten
vorkommen.

Abbildung \ref{fig:gestureRecognitionWorkflow} soll den Zusammenhang
zwischen Zeitraum und Anteil veranschaulichen. Wie zu sehen ist wurden in den
letzten 2 Sekunden 3 \emph{LURD} und 1 \emph{LSRD} Geste erkannt. Die Geste
\emph{LURD} wird dann propagiert wenn der Zeitraum auf 2 Sekunden und der
Mindestanteil auf 75\% gestellt ist. Bleibt der Zeitraum auf 2 Sekunden und
wird der Mindestanteil auf 100\% erhöht, so wird keine Geste erkannt, da die
Geste \emph{LSRD} den Gesamtanteil von \emph{LURD} im Erkennungszeitraum
vermindert. Ein Zeitraum von 1 Sekunde und einem Mindestanteil von 100\% würde
die Geste \emph{LURD} allerdings erkennen.

\begin{figure}[htp]
\begin{center}
  \includegraphics[width=0.8\textwidth]{image/gesture-recognition.pdf}
  \caption{Beispiel für aufgetretene Gesten}
  \label{fig:gestureRecognitionWorkflow}
\end{center}
\end{figure}

\subsection{Propagierung von erkannten Gesten}

\gerecoto propagiert erkannte Gesten als Nachrichten über einen eingestellten
Port (standardmäßig ist dies Port \texttt{6668}). So werden interessierte
Applikationen über die erkannten Gesten benachrichtigt und können wiederum
eigene Aktionen starten. Prinzipiell sind 2 Arten von Events möglich, welche
über den Port propagiert werden:

\begin{itemize}
  \item Eine neue Geste gestartet
  \item Geste wurde beendet
\end{itemize}

Je nachdem welche der beiden Eventtypen eintrifft, wird die zu verbreitende
Nachricht angepasst. Die versandte Nachricht wird in einem einfachen XML Format
dargestellt. Dadurch soll die Weiterverarbeitung erleichtert und vereinfacht
werden.

Wird ein Event vom Typ ``Geste gestartet'' verschickt, so wird zusätzlich zur
Art der Geste noch der Timestamp mitgeschickt, wann die Geste gestartet wurde.
Wird hingegen die Nachricht versandt, dass eine bestimmte Geste beendet wurde,
so wird die Dauer der Geste mitgeschickt.

\begin{verbatim}
<gesture type="LURD" eventType="GESTURE_STARTED" timestamp="1234567890" />
<gesture type="LURD" eventType="GESTURE_FINISHED" duration="1203" /> 
\end{verbatim}

\subsection{\gerecoto Benutzeroberfläche}

In Abbildung \ref{fig:gerecoto} ist die Benutzeroberfläche des \gerecoto
Frameworks zu sehen. Neben den Charakteristika der derzeitigen Positionen der
Tags ist auch die 3D Visualiserung zu erkennen.

\begin{figure}[htp]
\begin{center}
  \includegraphics[width=0.7\textwidth]{image/gerecoto-initial.png}
  \caption{Benutzeroberfläche des implementierten \gerecoto Frameworks}
  \label{fig:gerecoto}
\end{center}
\end{figure}

Die folgenden Abschnitte erklären den Ablauf, wie \gerecoto zu verwenden ist
und welche Schritte notwendig sind, sodass Gesten erkannt werden.

\subsubsection*{Tags zuweisen}

Als allererstes muss der Host und der Port angegben werden, zu welchen
\gerecoto eine Verbindung zwecks Benachrichtigung der Positionen aufbauen soll.
Dies erfolgt mittels dem Dialog, welcher im Menüpunkt \texttt{File /
Preferences} aufgerufen wird.

Ist der Host und der Port eingestellt, so werden alle eintreffenden Tag-IDs in
der Tabelle links oben aufgelistet. Das Textfeld unterhalb der Tabelle
ermöglicht eine Filterung der Tag-IDs, welche angezeigt werden. Jedes Tag,
welches für die Gestenerkennung verwendet werden soll, wird mittels der
Checkbox \texttt{trace?} ausgewählt (siehe
Abbildung~\ref{fig:gerecoto-tracing}).

\begin{figure}[htp!]
\begin{center}
  \includegraphics[width=0.7\textwidth]{image/gerecoto-tracing.png}
  \caption{Auswahl der zu verwendeten Tags}
  \label{fig:gerecoto-tracing}
\end{center}
\end{figure}

Der nächste Schritt besteht darin, anzugeben welche Tags welche Positionen am
Körper repräsentieren. Hierzu wird im Tab \texttt{Tag assignment} die jeweilige
Tag-ID für die entsprechende Position ausgewählt. Sind alle Positionen mit
Tag-IDs versehen, so hat die Visualisierung genug Informationen um die
Positionen als Punkte oder wahlweise auch ein Drahtgitter -- welches sie
Extremitäten repräsentieren soll -- darzustellen (siehe
Abbildung~\ref{fig:gerecoto-assign}).

\begin{figure}[htp]
\begin{center}
  \includegraphics[width=0.7\textwidth]{image/gerecoto-assign.png}
  \caption{Zuweisung der Tags zu den Positionen am Körper}
  \label{fig:gerecoto-assign}
\end{center}
\end{figure}

Nachdem die Tag-IDs den Positionen am Körper zugeteilt wurden, startet die
Gestenerkennung. Eine Anpasung der Parameter für die Gestenerkennung (siehe
Abschnitt~\ref{sec:calibration}) wird im nächsten Abschnitt erläutert.

\subsubsection*{Einstellen der Parameter für die Gestenerkennung}

Mittels der Eingabefelder im Tab \texttt{Gesture recognition} können die
jeweiligen Parameter der Gestenerkennung angepasst werden. Eine Änderung wirkt
sich dabei sofort auf den Erkennungsalgorithmus aus und muss nicht
extra gespeichert werden. Im Tab wird ausserdem die aktuelle Charaktersistik
der Positionen -- wie sie auch bei der Gestenerkennung verwendet werden --
angezeigt.

\subsubsection*{Aufnahme und Abspielen einer Messung}

Die Benutzeroberfläche bietet auch die Möglichkeit, eine Messungsreihe
aufzuzeichnen. Alle hierzu möglichen Einstellungen werden über das Tab
\texttt{Recording} vorgenommen (siehe Abbildung~\ref{fig:gerecoto-record}).

\begin{figure}[htp]
\begin{center}
  \includegraphics[width=0.7\textwidth]{image/gerecoto-record.png}
  \caption{Aufzeichnen und Abspielen von Messreihen}
  \label{fig:gerecoto-record}
\end{center}
\end{figure}

Mittels dem Klick auf \texttt{Start recording} wird eine neue Messung
aufgezeichnet. Es werden alle eintreffenden Positionen aufgezeichnet. Ein
erneuter Klick auf den Button beendet die Messung und diese wird als
\texttt{XML} Datei abgespeichert, wobei der Dateiname aus dem aktuellen Datum
besteht. Der Benutzer hat außerdem die Möglichkeit Notizen über die Messung
anzugeben.

Das Abspielen einer bereits aufgezeichneten Messung ist ebenfalls möglich.
Hierzu muss zuerst die Messung per Klick auf \texttt{load} geladen werden. Es
besteht die Möglichkeit manuell durch die gemessenen Positionen zu iterieren
oder durch den Klick auf \texttt{play} die Messung automatisch wiederzugeben.
Der Slider gibt die aktuelle Position innerhalb der Messreihe an und kann bei
manuellen Wiederhabemodus verschoben werden. Die Checkbox \texttt{loop?} gibt
an, ob bei der automatischen Wiedergabe beim Erreichen des Endes der Messreihe,
die Wiedergabe von vorne starten soll. 

\subsection{Mindestanforderungen}

\gerecoto benötigt mindestens Java 1.5 und eine installierte Java 3D Umgebung.


\newpage
\section{Konkrete Anwendung der erkannten Gesten anhand einer einfachen Musik
Jukebox}

Als konkrete Anwendung der erkannten Gesten wurde eine simple MP3 Jukebox
entwickelt, welche sich über spezielle Gesten steuern lässt. Die Jukebox hört
auf einen gewissen Port welchen \gerecoto für die Propagierung der Gesten
verwendet und führt je nach Geste eine Aktion aus. Die derzeit berücksichtigten
Gesten werden in Tabelle \ref{tab:jukeBoxGestures} aufgelistet.

\begin{table}[h!]
\begin{tabular}{l|l}
Geste & Aktion \\
\hline
LSRS180 & Wiedergabe starten bzw. stoppen \\
LSRD & nächster Titel \\
LDRS & vorheriger Title \\
LDRU & Lautstärke auf 0\% \\
LURD & Lautstärke auf 100\% \\
LSRS0 & Zufällige Wiedergabe
\end{tabular}
\caption{Jukebox Gesten}
\label{tab:jukeBoxGestures}
\end{table}

\begin{figure}[htp]
\begin{center}
  \includegraphics[width=200px]{image/mp3-player.png}
  \caption{Einfache Musik Jukebox}
  \label{fig:jukebox}
\end{center}
\end{figure}

\end{document}